/**
 * 公用方法
 */
import moment from 'moment'
import axios from 'axios'
import { saveAs } from 'file-saver'

// 根据统计类型获取对应统计时间范围，用于初始化统计时间
// 当统计类型为季度( quarter )统计时，统计时间初始值为当年 第一季度 到 当前季度
// 当统计类型为月度( month )统计时，统计时间初始值为当年 1月 到 当月
// 当统计类型为按日( day )统计时，统计时间初始值为当前月的 1日 到 当天
export const GetStatisticalTime = (formRef) => {
  const sumType = formRef.current.getFieldValue?.('sumType')
  switch (sumType) {
    case 'day':
      return {
        statisticalStartTime: moment().startOf('month').format('YYYY-MM-DD'),
        statisticalEndTime: moment().format('YYYY-MM-DD'),
      };
    case 'month':
      return {
        statisticalStartTime: moment().startOf('year').format('YYYY-MM'),
        statisticalEndTime: moment().format('YYYY-MM'),
      };
    case 'quarter':
      return {
        statisticalStartTime: moment().quarter(1),
        statisticalEndTime: moment().quarter(moment().quarter()),
      };
    default:
      break;
  }
}

/**
 * 获取当前的时间
 * @param {*} format 日期格式， 默认'YYYY-MM-DD'
 * @returns 
 */
export const GetNewDate = (format='YYYY-MM-DD') => {
  return moment().format(format)
}

/**
 * 获取 指定日期 之后的时间
 * @param {*} date 指定日期，默认当前时间
 * @param {*} num num dateType 以后，默认为1 ，比如 subtract(1, 'days') 表示1天后，subtract(2, 'days') 表示2天后...以此类推
 * @param {*} dateType 类型，默认为 days 取值参考http://momentjs.cn/docs/#/manipulating/add/ 例：subtract(1, 'days')表示一天后，subtract(1, 'week')表示一周之后...以此类推
 * @param {*} format 日期格式， 默认'YYYY-MM-DD'
 * @returns 
 */
export const GetAfterDate = ({date=new Date(), num=1, dateType='days', format='YYYY-MM-DD'}) => {
  return moment(date).add(num, dateType).format(format)
}

/**
 * 获取 指定日期 之前的时间
 * @param {*} date 指定日期，默认当前时间
 * @param {*} num num dateType 以前，默认为1 ，比如 subtract(1, 'days') 表示1天前，subtract(2, 'days') 表示2天前...以此类推
 * @param {*} dateType 类型，默认为 days 取值参考http://momentjs.cn/docs/#/manipulating/add/ 例：subtract(1, 'days')表示一天前，subtract(1, 'week')表示一周之前...以此类推
 * @param {*} format 日期格式， 默认'YYYY-MM-DD'
 * @returns 
 */
export const GetBeforeDate = ({date=new Date(), num=1, dateType='days', format='YYYY-MM-DD'}) => {
  return moment(date).subtract(num, dateType).format(format)
}

/**
 * 获取 指定日期的00:00:00
 * @param {*} date 指定日期
 * @returns 
 */
export const GetDateTimeStart = (date) => {
  return moment(date).startOf('day').format('YYYY-MM-DD HH:mm:ss')
}

/**
 * 获取 指定日期的23:59:59
 * @param {*} date 指定日期
 * @returns 
 */
export const GetDateTimeEnd = (date) => {
  return moment(date).endOf('day').format('YYYY-MM-DD HH:mm:ss')
}

/**
 * 获取ie版本
 * @returns Version 版本
 */
export function getIEVersion() {
  var userAgent = navigator.userAgent //取得浏览器的userAgent字符串
  var isIE = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1 //判断是否IE<11浏览器
  var isEdge = userAgent.indexOf('Edge') > -1 && !isIE //判断是否IE的Edge浏览器
  var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1 //判断是否IE11浏览器

  if (isIE) {
    var reIE = new RegExp('MSIE (\\d+\\.\\d+);')
    reIE.test(userAgent)
    var fIEVersion = parseFloat(RegExp['$1'])
    if (fIEVersion === 7) {
      return 7
    } else if (fIEVersion === 8) {
      return 8
    } else if (fIEVersion === 9) {
      return 9
    } else if (fIEVersion === 10) {
      return 10
    } else {
      return 6 //IE版本<=7
    }
  } else if (isEdge) {
    return 'edge' //edge
  } else if (isIE11) {
    return 11 //IE11
  } else {
    return -1 //不是ie浏览器
  }
}
export const BROWSER_IS_IE = getIEVersion() > 0

/**
 * 是否为空、null、undefinde
 * @param {*} value 
 * @returns 
 */
export function IsEmpty(value) {
  switch (value) {
    case "":
    case null:
    case undefined:
      return true;
    default:
      return false;
  }
}

/**
 * 获取url?号后的参数
 * @param {*} name 参数名
 * @returns 
 */
export function getQueryString(name) {
  const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  const r = window.location.search.substr(1).match(reg);
  if (r != null) {
      return decodeURI(r[2]);
  };
  return null;
}

	// file.js 封装下载本地文件方法
	/**
	 * @params {string} localFileName 本地文件名称
	 * @params {string} saveFileName 下载的文件名称
	 * @retuen {promise}
	 */
	export const downloadLocalFile = (localFileName, saveFileName) => {
	    return new Promise((resolve, reject) => {
	        axios({
	            url: localFileName,	// 本地文件夹路径+本地文件名称(若资源在服务器，且是具体的路径，这里可改成该资源路径，此时封装的方法需要微调，入参的localFileName改成资源路径resource)
	            method: 'get',					
	            responseType: 'blob',			//	arraybuffer	也可
	        }).then(res => {
	            const blob = new Blob([res.data])
	            if (navigator.msSaveBlob) {			// 兼容IE
	                navigator.msSaveBlob(blob, saveFileName)
	            } else {
	                const url = window.URL.createObjectURL(blob)
	                saveAs(url, saveFileName)
	            }
	            resolve()
	        }).catch(err => {
	        	// 这里可以统一处理错误，比如"未找到相关文件"，"下载失败"等
	        	if (err.message === 'Request failed with status code 404') {
	        		// 提示or弹框：未找到相关文件
	        	} else {
	        		// 提示or弹框：下载失败
	        	}
	            reject(err)
	        })
	    })
	}
